<?php
/**
 * This file is part of the Anota project.
 * 2011-2012 Fernando Garcia Huerta <fgarciahue@uoc.edu>
 * 
 * UOC - FUNDAMENTOS DE INFORM&aacute;TICA EN ENTORNOS BIOINFORM&aacute;TICOS - PEC2
 */
/**
 * templateAbout
 * 
 * @package    Anota
 * @subpackage application/template
 * @author     Fernando Garcia Huerta <fgarciahue@uoc.edu>
 */
?>
<div class="bloque">
    <h2>Objetivos</h2>
    Dise&ntilde;o de un protocolo web para anotar regiones genomicas basado en:
    <ul>
        <li>- <a href="http://genome.crg.es/software/geneid/" target="blank">geneid</a> "Program to predict genes in anonymous genomic sequences designed with a hierarchical structure."</li>       
        <li>- <a href="http://genome.crg.es/software/gfftools/GFF2PS.html" target="blank">gff2ps</a> "Produces PostScript graphical output from GFF-files."</li>
    </ul>
    <br />

    <h2>Proyecto Anota</h2>
    La aplicaci&oacute;n est&aacute; implementada integramente en php, a excepci&oacute;n de los cgis externos (geneid, gff2ps y convert).<br />
    El proyecto esta dividido en cinco paquetes l&oacute;gicos, cada uno con sus responsabilidades:<br />
    <ul>
        <li><strong>Application</strong>: Responsable del flujo de navegaci&oacute;n web y de la configuraci&oacute;n.</li>
        <li><strong>Module</strong>: Implementa cada una de las acciones que puede llevar a cabo el usuario.</li>
        <li><strong>Template</strong>: Plantillas de presentaci&oacute;n para cada p&aacute;gina web.</li>
        <li><strong>Business</strong>: Responsable de la ejecuci&oacute;n del Protocolo Bioinform&aacute;tico.</li>
        <li><strong>Dbo</strong>: Capa de abstracci&oacute;n de la interacci&oacute;n con la base de datos.</li>
    </ul>
    <img src="images/anota_main_diagram.png" alt="Anota Main Diagram" width="938px" />

    <h3>Paquete Application</h3>
    El proyecto tiene un solo pundo de entrada (<strong>index.php</strong>), y 
    las clases del paquete Application son las encargadas de llamar 
    dinamicamente al modulo/accion requerido por el usuario.<br />
    <br />

    En cada peticion al index, se carga en memoria la configuracion del
    proyecto (<strong>clase AnotaConfig</strong>) y se inicia una sesion de 
    usuario (<strong>clase AnotaUser</strong>).<br />
    <br />

    Posteriormente la <strong>clase AnotaController</strong> analiza los 
    parametros 'module' y 'action', crea y llama dinamicamente al modulo/accion 
    correspondiente, renderiza el resultado (construye una pagina web) y envia 
    el resultado de vuelta al usuario.<br />
    <br />

    La <strong>clase AnotaAutolader</strong> se encarga de cargar dinamicamente 
    las clases requeridas para evitar el uso masivo de 'includes' y 'requests' 
    tan molestos en los proyectos php.<br />
    <br />

    <h3>Paquete Module</h3>
    La p&aacute;gina web est&aacute; estructurada en tres secciones: about (<strong>clase 
        AnotaModuleAbout</strong>, anotate genomic region (<strong>clase
        AnotaModuleAnnotate</strong> y statistics (<strong>clase AnotaModuleStats
    </strong>). Todas ellas heredan de la <strong>clase AnotaModuleBase</strong>.<br />
    <br />

    Las clases de este paquete act&uacute;an b&aacute;sicamente como enganche entre el <em>
        Paquete Business</em> y el <em>Paquete Template</em>, de forma que por un 
    lado ejecutan funciones del primero y por otro proporcionan los datos 
    obtenidos al segundo.<br />
    <br />

    La <strong>clase AnotaModuleBase</strong> contiene la funcionalidad com&uacute;n a 
    todos los modulos de la aplicacion, proporcionando un template por defecto 
    a cada modulo y una funcion de renderizado de paginas estandarizada para 
    todos ellos. <br />
    <br />

    Cada clase del modulo es responsable de implementar tantas acciones como
    necesiten:
    <ul>
        <h4>AnotaModuleAbout</h4>
        <li><em>executeIndex</em>.- Muestra &eacute;sta p&aacute;gina.</li>

        <h4>AnotaModuleAnnotate</h4>
        <li><em>executeIndex</em>.- Muestra el formulario al usuario.</li>
        <li><em>executeForm</em>.- Valida y procesa el formulario. Si el formulario
            es v&aacute;lido, muestra los resultados, y si no muestra de nuevo el
            formulario resaltando los datos incorrectos.</li>

        <h4>AnotaModuleStats</h4>
        <li><em>executeIndex</em>.- Muestra la p&aacute;gina de estadisticas</li>
    </ul>

    <h3>Paquete Template</h3>
    El Paquete Template lo componen cada una de las plantillas de presentaci&oacute;n
    de la p&aacute;gina web. Todas ellas conforman la capa de presentaci&oacute;n de la 
    aplicaci&oacute;n.<br />
    <br />

    Internamente, las plantillas estan compuestas por c&oacute;digo html b&aacute;sico,
    complementado con instrucciones muy simples en php cuyo &uacute;nico fin es la
    presentaci&oacute;n en pantalla de los resultados. No realizan ninguna <em>"acci&oacute;n 
        util"</em> desde el punto de vista de la aplicaci&oacute;n, es decir, no realizan 
    c&aacute;lculos, ni modifican la base de datos, ni hacen nada que no sea presentar
    cosas por pantalla.<br />
    <br />

    La plantilla especial <strong>templateGlobal</strong> contiene el esquema
    (&oacute; layout) com&uacute;n de presentacion de toda la p&aacute;gina, es decir, actua como
    marco para todas la p&aacute;ginas de forma que el resto de las plantilla se 
    renderizan (se dibujan) en el interior de esta plantilla.<br />
    <br />

    <h3>Paquete Business</h3>
    El Paquete Business es el responsable de la ejecuci&oacute;n del Protocolo 
    Bioinform&aacute;tico objeto real de este trabajo. Recoje los datos del usuario
    una vez validados y ejecuta de forma encadenada todos los procesos 
    necesarios para la obtenci&oacute;n del resultado final. La clase encargada de todo
    el proceso se llama <strong>AnotaProtocol</strong>.<br />

    <h4>Protocolo Bioinformatico paso a paso:</h4>
    <ol>
        <li>Recogida de los datos del usuario una vez validados.</li>
        <li>Construcci&oacute;n del comando de geneid correspondiente.</li>
        <li>Registro en la base de datos de los parametros de geneid.</li>
        <li>Ejecuci&oacute;n del comando.</li>
        <li>Actualizacion de la base de datos con el tiempo de proceso de geneid.</li>
        <li>Ejecucion de geneid con parametros prefijados para generar un fichero GFF.</li>
        <li>Analisis del fichero GFF para la extracci&oacute;n de estad&iacute;sticas.</li>
        <li>Registro en la base de datos del n&uacute;mero de secuencias, genes y exones.</li>        
        <li>Ejecuci&oacute;n de gff2ps para generar un fichero postscript basado en el GFF anterior.</li>
        <li>Ejecuci&oacute;n de convert para generar un fichero jpg basado en el postscript anterior.</li>
        <li>Copia del fichero jpg a una carpeta publica de la web para poder ser mostrado al usuario.</li>
    </ol>

    <h3>Paquete Dbo</h3>
    Se trata de la capa de abstraccion de la base de datos. El Paquete Business 
    no acceder&aacute; nunca directamente a la base de datos, sino que lo har&aacute; siempre 
    v&iacute;a la funcionalidad proporcionada por &eacute;ste. <br />
    <br />

    El paquete consta de una clase base (<strong>clase DboBase</strong>) y dos 
    mas que heredan de ella, una para cada una de las tablas de la base de 
    datos. Las clases proporcionan una forma muy sencilla de almacenar objetos 
    en la base de datos simplemente llamando al m&eacute;todo <em>save()</em>, que 
    internamente se encarga de ejecutar un <em>insert</em> o un <em>update</em> 
    segun proceda.<br />
    <br />

    La <strong>clase DboProc</strong> es la encargada de gestionar las 
    peticiones a la tabla 'procs' y la <strong>clase DboSequence</strong> es la 
    encargada de la tabla 'sequences'. <br />
    <br />

    Para el correcto acceso a la base de datos, es necesario configurar el 
    fichero database.config con los parametros correpondientes. Con ese fin,
    junto con las fuentes del proyecto se proporciona un fichero llamado
    <strong>database.config.template</strong> en el que se explica que par&aacute;metro se
    debe especificar en cada una de las l&iacute;neas. Una vez debidamente
    cumplimentado es necesario eliminar la extensi&oacute;n '.template' del 
    fichero para dejarlo totalmente operativo.

    <h2>Estructura de la base de datos</h2>
    La base de datos esta compuesta por dos tablas: procs y sequences, y por 
    tres vistas: view_option_stats, view_proc_stats y view_sequence_stats.<br />
    <br />
    Existe un script para crear las tablas y las vistas (
    <strong>anota_database.sql</strong>), en el que se puede observar con
    detalle el tipo de cada campo as&iacute; como los selects necesarios para la
    creaci&oacute;n de las vistas (estad&iacute;sticas).<br />
    <br />

    <h3>Tabla procs</h3>
    Contiene una entrada por cada fichero procesado.<br />
    <h4>Campos: </h4>
    <ul>
        <li>id .- identificador &uacute;nico de proceso</li>
        <li>ip .- direccion ip del cliente</li>
        <li>filesize .- tama&ntilde;o en bytes del fichero procesado</li>
        <li>options .- opciones seleccionadas por el usuario</li>
        <li>created_at .- momento en el que se comenz&oacute; a procesar el fichero</li>
        <li>updated_at .- momento en el que se termin&oacute; de procesar el fichero</li>
    </ul>

    <h3>Tabla sequences</h3>
    Contiene una entrada por cada secuencia procesada. Recordemos que un fichero 
    puede contener mas de una secuencia.<br />
    <h4>Campos: </h4>
    <ul>
        <li>id .- identificador &uacute;nico de sequencia</li>
        <li>idproc .- identificador del proceso del que proviene la secuencia</li>
        <li>length .- longitud de la secuencia</li>
        <li>numgenes .- n&uacute;mero de genes de la secuencia</li>
        <li>numexons .- n&uacute;mero de exones de la secuencia</li>
    </ul>

    <h3>Vista view_proc_stats</h3>
    Estad&iacute;sticas sobre la tabla procs.<br />
    <h4>Campos: </h4>
    <ul>
        <li>numprocs .- n&uacute;mero total de procesos realizados</li>
        <li>num_ips .- n&uacute;mero de ips diferentes que han realizado algun proceso.</li>
        <li>first_proc_date .- fecha en que se realiz&oacute; el primer proceso.</li>
        <li>last_proc_date .- fecha en que se realiz&oacute; el &uacute;ltimo proceso.</li>
        <li>max_filesize .- tama&ntilde;o del fichero mas grande procesado.</li>
        <li>min_filesize .- tama&ntilde;o del fichero mas peque&ntilde;o procesado.</li>
        <li>avg_filesize .- tama&ntilde;o medio de los ficheros procesados.</li>
        <li>max_proctime .- tiempo maximo que se ha tardado en procesar un fichero</li>
        <li>min_proctime .- tiempo m&iacute;nimo que se ha tardado en procesar un fichero</li>
        <li>avg_proctime .- tiempo medio que se tarda en procesar un fichero</li>
    </ul>

    <h3>Vista view_sequence_stats</h3>
    Estad&iacute;sticas sobre la tabla sequences.<br />   
    <h4>Campos: </h4>
    <ul>
        <li>num_sequences .- n&uacute;mero total de secuencias procesadas.</li>
        <li>max_length .- longitud de la secuencia mas larga procesada.</li>
        <li>min_length .- longitud de la secuencia mas corta procesada.</li>
        <li>avg_length .- longitud media de las secuencias procesadas.</li>
        <li>max_numgenes .- n&uacute;mero maximo de genes encontrados en una secuencia</li>
        <li>min_numgenes .- n&uacute;mero m&iacute;nimo de genes encontrados en una secuencia</li>
        <li>avg_numgenes .- n&uacute;mero medio de genes encontrados por secuencia</li>
        <li>max_numexons .- n&uacute;mero m&aacute;ximo de exones encontrados en una secuencia</li>
        <li>min_numexons .- n&uacute;mero m&iacute;nimo de exones encontrados en una secuencia</li>
        <li>avg_numexons .- n&uacute;mero medio de exones encontrados en una secuencia</li>
    </ul>

    <h3>Vista view_option_stats</h3>
    Estad&iacute;sticas sobre las opciones seleccionadas por el usuario.<br />
    <h4>Campos: </h4>
    <ul>
        <li>b .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-b'</li>
        <li>d .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-d'</li>
        <li>a .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-a'</li>
        <li>e .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-e'</li>
        <li>f .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-f'</li>
        <li>i .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-i'</li>
        <li>t .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-t'</li>
        <li>s .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-s'</li>
        <li>x .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-x'</li>
        <li>z .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-z'</li>
        <li>upper_d .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-D'</li>
        <li>upper_g .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-G'</li>
        <li>upper_x .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-X'</li>
        <li>upper_m .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-M'</li>
        <li>m .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-m'</li>
        <li>upper_w .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-W'</li>
        <li>upper_c .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-C'</li>
        <li>o .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-o'</li>
        <li>upper_f .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-F'</li>
        <li>upper_o .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-O'</li>
        <li>upper_z .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-Z'</li>
        <li>aspergillus .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P aspergillus.param'</li>
        <li>cinereus .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P cinereus.param'</li>
        <li>cneomorfans .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P cneomorfans.param'</li>
        <li>dictyostelium .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P dictyostelium.param'</li>
        <li>dros .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P dros.param'</li>
        <li>human1iso .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P human1iso.param'</li>
        <li>human3iso .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P human3iso.param'</li>
        <li>neurospora .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P neurospora.param'</li>
        <li>plasmodium .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P plasmodium.param'</li>
        <li>rice .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P rice.param'</li>
        <li>tetraodon .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P tetraodon.param'</li>
        <li>wheat .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P wheat.param'</li>
        <li>yeast .- n&uacute;mero de veces que se ha utilizado la opci&oacute;n '-P yeast.param'</li>
    </ul>

    <h2>Consideraciones Generales</h2>

    <h3>Lenguaje de Programacion</h3>
    Tras un analisis incial del proyecto, me decid&iacute; por la elaboraci&oacute;n de
    una aplicaci&oacute;n completamente funcional y abierta a nuevas ampliaciones.
    Bajo ese supuesto el lenguaje de programaci&oacute;n php est&aacute; mejor preparado
    para soportar aplicaciones web complejas que perl.<br />
    <br />

    El c&oacute;digo fuente de la aplicaci&oacute;n esta completamente comentado, de forma
    que en cada fichero se explica la funcionalidad de cada clase y de cada
    funci&oacute;n.<br />
    <br />

    <h3>Orientaci&oacute;n a Objetos</h3>    
    La aplicacion se ha dise&ntilde;ado con una aproximaci&oacute;n orientada a objetos,
    y agrupaci&oacute;n en capas con responsabilidades independientes y diferenciadas.
    De esta forma <strong>cada problema es resuelto de forma aislada</strong>
    por su clase responsable. <br />
    En el caso que nos ocupa, <strong>el protocolo bioinform&aacute;tico queda 
        resuelto enteramente en la clase AnotaProtocol </strong> de la capa <strong>Business</strong>. 
    El resto de las clases y capas <em>solo</em> son responsables de la toma de 
    datos, validaci&oacute;n, registro y presentaci&oacute;n de los mismos.<br />
    <br />

    <h3>Disponibilidad del proyecto</h3>
    Teniendo en cuenta que el proyecto se ha creado con bocaci&oacute;n de crecimiento,
    he tomado las siguientes decisiones: 
    <ul>
        <li>Todas las p&aacute;ginas web del proyecto, a excepci&oacute;n de esta misma estan en ingles</li>
        <li>El c&oacute;digo fuente del proyecto esta comentado en ingles.</li>
        <li>El c&oacute;digo fuente del proyecto est&aacute; disponible p&uacute;blicamente.</li>
        <li>Todas las herramientas utilizadas para la realizaci&oacute;n del proyecto son de libre disposici&oacute;n:</li>
        <ul>
            <li>Sistema Operativo: <a href="http://www.debian.org/">Linux Debian</a></li>
            <li>Entorno de trabajo: <a href="http://netbeans.org/">Netbeans</a></li>
            <li>Servidor web: <a href="http://httpd.apache.org/">Apache</a></li>
            <li>Servidor de base de datos: <a href="http://www.mysql.com/">MySql</a></li>
            <li>Control de versiones: <a href="http://git-scm.com/">Git</a></li>
            <li>Alojamiento del proyecto: <a href="http://code.google.com/intl/es-ES/">Google code</a></li>
        </ul>

    </ul>

    Hay una versi&oacute;n operativa del proyecto en la siguiente direcci&oacute;n:
    <a href="http://anota.nanomuelle.com">anota.nanomuelle.com</a><br />
    <br />
    
    El proyecto est&aacute; alojado en un servidor p&uacute;blico de Google Code, desde donde
    puede ser descargado y modificado a placer por cualquiera que est&eacute; interesado en ello:
    <a href="http://code.google.com/p/anota-nanomuelle-com/">Proyecto Anota</a><br />
    <br />

    El proyecto continuar&aacute; alojado en dicho servidor de forma indefinida, salvo que:
    <ul>
        <li>Se ponga fin a su disponibilidad por petici&oacute;n expresa de algun responsable de la <a href="http://www.uoc.edu">U.O.C.</a>
        bajo el amparo de la cual estoy realizando este curso.</li>
        <li>Yo decida poner fin a su disponibilidad de forma unilateral y sin previo aviso.</li>
    </ul>
    
    <h2>Estado del proyecto</h2>
    Como todo proyecto que se precie, nunca est&aacute; completo. A continuaci&oacute;n
    se detalla una lista de tareas pendientes <em>conocidas</em>, a las que
    habr&aacute; que sumar tanto la lista de bugs que ir&aacute;n surgiendo a medida que el 
    proyecto sea utilizado por el p&uacute;blico en general, como la lista de 
    sujerencias aportadas por los usuario de la misma.
    
    <h3>geneid</h3>
    A&ntilde;adir soporte para los siguientes parametros de geneid
    <ul>
        <li><em>Re-annotation of sequences</em></li>
        <ul>
            <li>-R: Include annotations (evidences) provided from file</li>
            <li>-S: Use homology to protein information (SR) provided from file</li>
        </ul>
        <li><em>Statistical model</em></li>
        <ul>        
            <li>-E: Increase/decrease exon weight value</li>
            <li>-P: Provide a new parameter file</li>
        </ul>    
    </ul>
    
</div>        
